
typedef struct genericList
{
    void *data;
    struct genericList *sgt;
}gl;


typedef struct genericDobleList
{
    void *data;
    struct genericDobleList *ant;
    struct genericDobleList *sgt;
}gdl;

typedef struct genericCola
{
    void *data;
    struct genericList *sgt;
    struct genericCola *ant;
}gc;


typedef struct genericListWithSublist
{
    void *data;
    struct genericListWithSublist *content;
    struct genericListWithSublist *sgt;
}glws;


typedef struct ListaIDdescriptors 
{
	char sDescriptorID_delPedido[20];
	char sSocketPorElCualResponder[20];   /*depende de quien haya hecho el pedido, puede ser el socket que esta conectado con el hilo de la consola, o el socket al que se conecto el array*/
	int sector;
	char data[512];	/*CERRAR_SOCKET   ó NO_CERRAR*/
	struct ListaIDdescriptors * Sgt;
	struct ListaIDdescriptors * Ant;
}listaIDDescriptors;

typedef struct ClienteConocido {
	int socketCliente;
	unsigned int offset;
	unsigned int size;
	struct ClienteConocido * Sgt;
	struct ClienteConocido * Ant;
}cliente ;

void addToList(gl *list, void *data);
void deleteToList(gl *list, void *data);
void deleteToListByPosition(gl *list, int pos);
void* memoryReserve(void *dato);
void addToListWithSublist(glws *list, void *data, glws *sublist);
int addToDobleList(gdl **pfirst, gdl **plast, gdl **pnodo);
int moveToBackOfDobleList(gdl ** pfirst, gdl ** plast, gdl ** pnodo);
int bringToFrontOfDobleList(gdl ** pfirst, gdl ** plast, gdl ** pnodo);


int longitud(struct ListaIDdescriptors *  ptrActual);
int estaVacia(struct ListaIDdescriptors * ListaDeIDPedidos);
struct ListaIDdescriptors * SacarNodoDescriptoresDeLista(struct ListaIDdescriptors ** ListaDeIDPedidos, struct ListaIDdescriptors ** ListaDeIDPedidos_Ult);
void imprimirCola(struct ListaIDdescriptors *ptrActual);
int	AgregarAColaDePedidosADisco(struct ListaIDdescriptors ** pnodo, struct ListaIDdescriptors ** ListaDeIDPedidos, struct ListaIDdescriptors ** ListaDeIDPedidos_Ult );
int agregarAListaDeClientes(cliente ** pnodo,cliente** ListaClientes,cliente** ListaClientes_Ult);
int SacarDeLista_Clientes(cliente ** nodo,cliente**ListaClientes,cliente**ListaClientes_Ult );

void addToListWithSublist(glws *list, void *data, glws *sublist)
{
    if (list->data == NULL)
    {
        list->data = data;
	list->content = sublist;        
        list->sgt = NULL;
    }
    else
    {
        glws *aux = list;
        while (aux->sgt!=NULL)
        {
            aux = aux->sgt;                                                                                                                                          
        }
        glws *newNode = (glws*) malloc(sizeof(glws));
        newNode->data = data;
	newNode->content = sublist;
        newNode->sgt = NULL;
        aux->sgt = newNode;
    }
}


void addToList(gl *list, void *data)
{
    if (list->data == NULL)
    {
        list->data = data;
        list->sgt = NULL;
    }
    else
    {
        gl *aux = list;
        while (aux->sgt!=NULL)
        {
            aux = aux->sgt;
        }
        gl *newNode = (gl*) malloc(sizeof(gl));
        newNode->data = data;
        newNode->sgt = NULL;
        aux->sgt = newNode;
    }
}



void addListToList(gl *list, gl *listToAdd)
{
    int i = 0;
    gl *q = listToAdd;
    for(i=0;q!=NULL;i++)
    {
      addToList(list,q->data);
      q = q->sgt;
    }
}

void deleteToList(gl *list, void *data)
{
    gl *aux = list;
    if (aux!=NULL)
    {
        if (aux->data!=data)
        {
            while (aux->sgt!=NULL && aux->sgt->data!=data)
            {
                aux = aux->sgt;
            }
            if (aux->sgt != NULL)
            {
                gl *dispose;
                dispose = aux->sgt;
                aux->sgt = aux->sgt->sgt;
                free(dispose);
            }
        }
        else
            *list = *aux->sgt;
    }
}

void deleteListToList(gl *list, gl *listToDelete)
{
    int i = 0;
    gl *q = listToDelete;
    for(i=0;q!=NULL;i++)
    {
      gl *aux = q->sgt;
      deleteToList(list,q->data);
      q = aux;
    }
}

void deleteToListByPosition(gl *list, int pos)
{
    gl *aux = list;
    gl *ant = list;
    int i = 0;
    if (aux!=NULL)
    {
        for (i = 0;aux != NULL && i < pos; i++)
        {
            aux = aux->sgt;
            if (i!=0)
                ant = ant->sgt;
        }
        if (i!=0)
        {
            if (aux!=NULL)
            {
                gl *dispose;
                dispose = aux;
                ant->sgt = aux->sgt;
                free(dispose);
            }
        }
        else
            *list = *aux->sgt;

    }
}

void* memoryReserve(void *dato)
{
    dato = (void*) malloc(sizeof(void));
}



void addToCola(gc *list, void *data)
{
}

int addToDobleList(gdl **pfirst, gdl **plast, gdl **pnodo)
{
    if((*pfirst) == NULL)
    {
	(*pnodo)->ant = NULL;
	(*pnodo)->sgt = NULL;

	(*pfirst) = (*pnodo);
	(*plast) = (*pnodo);

    }	
    else
    {
	(*pnodo)->ant = (*plast);
	(*pnodo)->sgt = NULL;
	(*plast)->sgt = (*pnodo);
	(*plast) = (*pnodo);
    }
}


int moveToBackOfDobleList(gdl ** pfirst, gdl ** plast, gdl ** pnodo)
{

    if((*pfirst) == NULL || (*plast) == NULL)
	return -1;


    if((*pnodo) != (*plast) )
    {
	if ((*pnodo)->ant != NULL)
	{
	    (*pnodo)->ant->sgt = (*pnodo)->sgt;
	    (*pnodo)->sgt->ant = (*pnodo)->ant;
	}
	else				/* pnodo es el primero de la lista */
	{
	    (*pnodo)->sgt->ant = NULL;
	    (*pfirst) = (*pnodo)->sgt;
	}

	(*plast)->sgt = (*pnodo);
	(*pnodo)->ant = (*plast);

	(*plast) = (*pnodo);
	(*plast)->sgt = NULL;

    }

    return 0;
}
	
	
int bringToFrontOfDobleList(gdl ** pfirst, gdl ** plast, gdl ** pnodo)
{

    if((*pfirst) == NULL || (*plast) == NULL)
	return -1;

    if((*pnodo) != (*pfirst) )
    {
	if ((*pnodo)->sgt != NULL)
	{
	    (*pnodo)->ant->sgt = (*pnodo)->sgt;
	    (*pnodo)->sgt->ant = (*pnodo)->ant;
	}
	else /* pnodo es el ultimo de la lista */
	{
	    (*pnodo)->ant->sgt = NULL;
	    (*plast) = (*pnodo)->ant;  
	}

	(*pnodo)->ant = NULL;
	(*pnodo)->sgt = (*pfirst);
	(*pfirst)->ant = (*pnodo);
	(*pfirst) = (*pnodo);
	
    }

    return 0;
}




int SacarDeLista_Clientes(cliente ** nodo,cliente**ListaClientes,cliente**ListaClientes_Ult )  /*solo desenalzar el nodo de la lista ListaDA , sin liberar*/
{


if(  ((*nodo)->Ant == NULL) && ((*nodo)->Sgt == NULL)  )
	{
	*ListaClientes_Ult = NULL;
	*ListaClientes = NULL;

	}
else if(  ((*nodo)->Ant == NULL) && ((*nodo)->Sgt != NULL)  )
{
	*ListaClientes = (*nodo)->Sgt;
	(*ListaClientes)->Ant = NULL;
}

else if(  ((*nodo)->Ant != NULL) && ((*nodo)->Sgt == NULL)  )
{

	*ListaClientes_Ult = (*nodo)->Ant;
	(*ListaClientes_Ult)->Sgt = NULL;

}
else if(  ((*nodo)->Ant != NULL) && ((*nodo)->Sgt != NULL)  )
	{
	(*nodo)->Ant->Sgt=(*nodo)->Sgt;
	(*nodo)->Sgt->Ant=(*nodo)->Ant;

	}



return 0;


}


int agregarAListaDeClientes(cliente ** pnodo,cliente** ListaClientes,cliente** ListaClientes_Ult)			/*Agrega el nodo a la lista ListaDiscos (enlazar) */
{

if(*ListaClientes == NULL)
	{
   
	(*pnodo)->Ant = NULL;
	(*pnodo)->Sgt = NULL;

	*ListaClientes = (*pnodo);
	*ListaClientes_Ult = (*pnodo);
	
	}	

else
	{
	(*pnodo)->Ant = NULL;
	(*pnodo)->Sgt = *ListaClientes;

	(*ListaClientes)->Ant = (*pnodo);

	*ListaClientes = (*pnodo);
	
	}

}

int	AgregarAColaDePedidosADisco(struct ListaIDdescriptors ** pnodo, struct ListaIDdescriptors ** ListaDeIDPedidos, struct ListaIDdescriptors ** ListaDeIDPedidos_Ult )
{
	struct ListaIDdescriptors *anterior;
	struct ListaIDdescriptors *aux;
	
	if((*ListaDeIDPedidos) == NULL)
	{
		(*pnodo)->Ant = NULL;
		(*pnodo)->Sgt = NULL;
		(*ListaDeIDPedidos) = (*pnodo);
	}	
	else
	{
		(*pnodo)->Ant = *ListaDeIDPedidos_Ult;	
		(*pnodo)->Sgt = NULL;
		(*ListaDeIDPedidos_Ult)->Sgt = (*pnodo);
	}
	
	*ListaDeIDPedidos_Ult=*pnodo;
	
}

void imprimirCola(struct ListaIDdescriptors *ptrActual)
{

   if(ptrActual==NULL)
      printf("La cola esta vacia\n");

   else{
   
		printf("La Cola es: \n");
		while(ptrActual!=NULL){
      
			printf("%i->",ptrActual->sector);
			ptrActual=ptrActual->Sgt;  
		}
		printf("NULL \n");  
   }
   
} 

struct ListaIDdescriptors * SacarNodoDescriptoresDeLista(struct ListaIDdescriptors ** ListaDeIDPedidos, struct ListaIDdescriptors ** ListaDeIDPedidos_Ult)
{
	struct ListaIDdescriptors * temp;
	
	temp=*ListaDeIDPedidos;
	*ListaDeIDPedidos=(*ListaDeIDPedidos)->Sgt;
	if(*ListaDeIDPedidos == NULL){
      *ListaDeIDPedidos_Ult=NULL;
	}
	return temp;
	
}

int estaVacia(struct ListaIDdescriptors * ListaDeIDPedidos)
{

   return ListaDeIDPedidos==NULL;

}

int longitud(struct ListaIDdescriptors *  ptrActual) 
{
	
	int n=0;
	
	while (ptrActual != NULL) {  
      ++n;
	   ptrActual = ptrActual->Sgt;
	}
	return n;

}


/*FIN Listas*/



